package 递归;

import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @PackageName: 递归
 * @ClassName: LeetCode394
 * @Author: chen jinxu
 * @Date: 2022/8/14 16:41
 * @Description: //字符串解码
 * 给定一个经过编码的字符串，返回它解码后的字符串。
 * 编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
 * 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
 * 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像3a或2[4]的输入。
 *
 * 输入：s = "3[a]2[bc]"
 * 输出："aaabcbc"
 *
 * 输入：s = "3[a2[c]]"
 * 输出："accaccacc"
 * 输入：s = "2[abc]3[cd]ef"
 * 输出："abcabccdcdcdef"
 * 输入：s = "abc3[cd]xyz"
 * 输出："abccdcdcdxyz"
 */
public class LeetCode394Digui {
    public static void main(String[] args) {
        System.out.println(decodeString("3[a]2[bc]"));
        System.out.println(decodeString("3[a2[c]]"));
        System.out.println(decodeString("2[abc]3[cd]ef"));
        System.out.println(decodeString("abc3[cd]xyz"));
    }
    static String src;
    static int ptr;
    public static String decodeString(String s) {
        src = s;
        ptr = 0;
        return getString();
    }
    public static String getString() {
        if (ptr == src.length() || src.charAt(ptr) == ']') {
            return "";
        }
        char cur = src.charAt(ptr);
        int repTime = 1;
        String ret = "";
        if (Character.isDigit(cur)) {
            // 解析数字
            repTime = getDigits();
            // 过滤左括号
            ptr++;
            String str = getString();
            // 过滤右括号
            ptr++;
            // 构造字符串
            while (repTime-- > 0) {
                ret += str;
            }
        } else if (Character.isLetter(cur)) {
            // 解析string
            ret = String.valueOf(src.charAt(ptr++));
        }
        return ret + getString();
    }

    private static int getDigits() {
        int ret = 0;
        while (ptr < src.length() && Character.isDigit(src.charAt(ptr))) {
            ret = ret * 10 + src.charAt(ptr++) - '0';
        }
        return ret;
    }

}
